iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 21
5
Everything on Azure

三十天.NET❤️Azure漸進式開發專案系列 第 21

三十天.NET與Azure漸進式開發專案(21): Debug超進化Snapshot! (Exception偵錯快照)

  • 分享至 

  • xImage
  •  

2018-10-26.21.06.36-image.png
  今天延續前兩篇文章對Debug做一個超進化,加上Azure獨有Snapshot神器:Exception偵錯快照。

  是否讀者有過這樣經歷,使用者說: "XXX功能有BUG啦,我現在都不能使用,幫我看甚麼問題!" ,結果幫忙處理時,發現沒有任何問題。這是因為當時的時間、環境、變數都不一樣了,要還原一樣情景測試是非常困難的一件事,可能某個變數的不一樣,就會造成結果的不同。要避免上述情況,通常要寫複雜程式,做好LOG保存當下的變數值。

  而Azure提供Snapshot Exception偵錯快照功能,可以把當初錯誤的環境、變數值自動保存起來,以下是使用方式跟介紹。


環境:

  • .NET Core 2.1版本
  • Visual Studio 2017 Community

使用方式:

【第一步】:安裝Microsoft.ApplicationInsights.SnapshotCollector Microsoft.ApplicationInsights.AspNetCore NuGet套件

Install-Package Microsoft.ApplicationInsights.SnapshotCollector -Version 1.3.1
Install-Package Microsoft.ApplicationInsights.AspNetCore -Version 2.5.1

【第二步】:Snapshot在Startup註冊步驟:

  1. 添加引用ApplicationInsights、SnapshotCollector Lib
  2. 建立Snapshot工廠類別
  3. 註冊Service服務
// Snapshot在Startup註冊步驟
//      1.引用ApplicationInsights、SnapshotCollector Lib
using Microsoft.ApplicationInsights.SnapshotCollector;
using Microsoft.Extensions.Options;
using Microsoft.ApplicationInsights.AspNetCore;
using Microsoft.ApplicationInsights.Extensibility;

public class Startup
{
		//..略
        //      2.建立Snapshot工廠類別
        private class SnapshotCollectorTelemetryProcessorFactory : ITelemetryProcessorFactory
        {
                private readonly IServiceProvider _serviceProvider;

                public SnapshotCollectorTelemetryProcessorFactory(IServiceProvider serviceProvider) =>
                _serviceProvider = serviceProvider;

                public ITelemetryProcessor Create(ITelemetryProcessor next)
                {
                var snapshotConfigurationOptions = _serviceProvider.GetService<IOptions<SnapshotCollectorConfiguration>>();
                return new SnapshotCollectorTelemetryProcessor(next, configuration: snapshotConfigurationOptions.Value);
                }
        }

        public void ConfigureServices(IServiceCollection services)
        {
                //      3.註冊Service服務    
                services.Configure<SnapshotCollectorConfiguration>(Configuration.GetSection(nameof(SnapshotCollectorConfiguration)));
                services.AddSingleton<ITelemetryProcessorFactory>(sp => new SnapshotCollectorTelemetryProcessorFactory(sp));
        }
        //..略
}

【第三步】:對想要監控程式區塊做Snapshot快照的步驟:

  1. 建立TelemetryClient物件
  2. 使用Try Catch包住想要監控的程式區塊,並使用TrackException方法傳遞Exception物件觸發快照
public class HomeController : Controller
{
        //對想要監控程式區塊做Snapshot快照的步驟:
        //      1.建立TelemetryClient物件
        TelemetryClient _telemetryClient = new TelemetryClient();
        public IActionResult Index()
        {
                //      2.使用Try Catch包住想要監控的程式區塊,並使用TrackException方法傳遞Exception物件觸發快照
                try
                {
                        var zero = 0;
                        var error = 1 / zero;
                }
                catch (Exception ex)
                {
                        _telemetryClient.TrackException(ex);
                        throw ex;
                }
                return View();
        }
}

【第四步】:添加appsettings.json環境變數設定

{
  "SnapshotCollectorConfiguration": {
    "IsEnabledInDeveloperMode": false,
    "ThresholdForSnapshotting": 1,
    "MaximumSnapshotsRequired": 3,
    "MaximumCollectionPlanSize": 50,
    "ReconnectInterval": "00:15:00",
    "ProblemCounterResetInterval": "1.00:00:00",
    "SnapshotsPerTenMinutesLimit": 1,
    "SnapshotsPerDayLimit": 30,
    "SnapshotInLowPriorityThread": true,
    "ProvideAnonymousTelemetry": true,
    "FailedRequestLimit": 3
  }
}

【第五步】:發行到Azure雲端,檢查環境安裝
確定app service擴充功能有安裝Snapshot Debugger:
2018-10-27.03.22.26-image.png
2018-10-26.21.02.45-image.png

以上就是使用Snapshot前的準備,只需要幾個步驟,接著讓我們來看看效果。


查看SnapShot結果:

打開 Application Insights > 失敗次數 > 採用動作 > 作業 > 在選取範例作業點擊想查詢的作業
2018-10-26.21.15.22-image.png
2018-10-26.21.17.56-image.png

端對端交易詳細資料 > 點選想查詢的Exception > 開啟 偵錯快照集
2018-10-26.21.13.37-image.png

登!登!登!
可以在偵錯快照集 > Locals ,看到錯誤當下所使用的變數 :
2018-10-26.21.20.13-image.png

甚至想查出當初引起錯誤的Reqeust資料,像是Body、Cookie都是可以的!當初看到這功能,我起雞皮疙瘩!!
2018-10-26.21.24.47-image.png


上一篇
三十天.NET與Azure漸進式開發專案(20): 使用Application Insights Debug Exception
下一篇
三十天.NET與Azure漸進式開發專案(22): 解決初始化異常-使用Kudu、FTP調查eventlog.xml
系列文
三十天.NET❤️Azure漸進式開發專案30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言